Redis Basic Rate Limiting Pattern
Redis で rate limitter は INCR と EXPIRE を使えば簡単に実装できる rate limitter とは、特定サービスを特定の期間リクエスト数に制限をかける
例: api key ごとに 20request/minute の制限
フロー
現在のリクエスト数を取得
GET [user-api-key]:[current minute number]
20以上だったら エラーに
現在のリクエスト数を加算
code:sh
MULTI
EXEC
例えば APIKey zA21X31 に対するデータはこんな感じになる
table:_
RedisKey zA21X31:0 zA21X31:1 zA21X31:2 zA21X31:3 zA21X31:4
Value 3 8 20 2 20
ExpiresAt Latest 12:02 Latest 12:03 Latest 12:04 Latest 12:05 Latest 12:06
Time 12:00 12:01 12:02 12:03 12:04
12:02, 12:04 に制限がかかる
発生しうる問題
何らかの原因(かなりレアケース)で INCR と EXPIRE の間にRedisサーバーが落ちたら INCR はリストアされない